package com.example.mediasession;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.media.MediaBrowserCompat;
import android.support.v4.media.MediaMetadataCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.PlaybackStateCompat;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.media.MediaBrowserServiceCompat;
import androidx.media.session.MediaButtonReceiver;

import java.util.ArrayList;
import java.util.List;

public class MediaService extends MediaBrowserServiceCompat {
    private static final String TAG = "MediaService";// 日志标签
    private MediaSessionCompat mediaSession; // 媒体会话对象
    private boolean isPlaying = false; // 播放状态标志
    private static final String CHANNEL_ID = "media_channel"; // 通知通道ID
    private static final int NOTIFICATION_ID = 1; // 通知ID
    private static final String MEDIA_ROOT_ID = "media_root_id";// 媒体根ID

    @Override
    public void onCreate() {
        super.onCreate();

        // 创建媒体会话
        mediaSession = new MediaSessionCompat(this, "SimpleMediaSession");

        // 设置媒体元数据（歌曲信息）
        MediaMetadataCompat metadata = new MediaMetadataCompat.Builder()
                .putString(MediaMetadataCompat.METADATA_KEY_TITLE, "TEST歌曲")
                .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, "TEST歌手")
                .build();
        mediaSession.setMetadata(metadata);

        // 设置播放状态
        updatePlaybackState();

        // 设置会话令牌
        setSessionToken(mediaSession.getSessionToken());

        // 设置回调处理播放控制
        mediaSession.setCallback(new MediaSessionCompat.Callback() {
            @Override
            public void onPlay() {
                isPlaying = true;
                updatePlaybackState();
                startForeground(NOTIFICATION_ID, createNotification());
            }

            @Override
            public void onPause() {
                isPlaying = false;
                updatePlaybackState();
            }
        });

        // 创建通知通道
        createNotificationChannel();

        // 启动前台服务
        startForeground(NOTIFICATION_ID, createNotification());
    }
    /**
     * 更新媒体播放状态
     *
     * 该方法根据当前播放状态创建PlaybackStateCompat对象，并将其设置到mediaSession中。
     * 主要用于通知系统当前媒体的播放状态（播放中或暂停），以及支持的播放控制操作。
     */
    private void updatePlaybackState() {
        // 根据当前播放状态确定要设置的播放状态值
        int state = isPlaying ? PlaybackStateCompat.STATE_PLAYING : PlaybackStateCompat.STATE_PAUSED;
        // 构建播放状态对象，包含状态、位置、播放速度和支持的操作
        PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder()
                .setState(state, 0, 1.0f)
                .setActions(PlaybackStateCompat.ACTION_PLAY |
                        PlaybackStateCompat.ACTION_PAUSE |
                        PlaybackStateCompat.ACTION_PLAY_PAUSE)
                .build();
        // 将构建好的播放状态设置到媒体会话中
        mediaSession.setPlaybackState(playbackState);
    }

    private void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                    CHANNEL_ID,
                    "媒体播放",
                    NotificationManager.IMPORTANCE_LOW
            );
            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(channel);
        }
    }
    //创建媒体播放通知
    private Notification createNotification() {
        // 创建通知点击意图
        Intent intent = new Intent(this, MainActivity.class);
        //PendingIntent 是一个延迟执行的 Intent，通常用于由其他组件（如通知或其他系统服务）触发的场景
        PendingIntent pendingIntent = PendingIntent.getActivity(
                this, 0, intent,
                PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT
        );

        // 创建通知构建器实例，用于构建媒体播放通知
        // 设置通知渠道ID为CHANNEL_ID
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle(mediaSession.getController().getMetadata().getString(MediaMetadataCompat.METADATA_KEY_TITLE))
                .setContentText(mediaSession.getController().getMetadata().getString(MediaMetadataCompat.METADATA_KEY_ARTIST))
                .setSmallIcon(R.drawable.ic_launcher_foreground)
                .setContentIntent(pendingIntent)
                .setPriority(NotificationCompat.PRIORITY_LOW)
                .setStyle(new androidx.media.app.NotificationCompat.MediaStyle()
                        .setMediaSession(mediaSession.getSessionToken())
                        .setShowActionsInCompactView(0))
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC);

        // 添加播放/暂停按钮
        if (isPlaying) {
            builder.addAction(new NotificationCompat.Action(
                    android.R.drawable.ic_media_pause, "暂停",
                    MediaButtonReceiver.buildMediaButtonPendingIntent(
                            this, PlaybackStateCompat.ACTION_PAUSE)));
        } else {
            builder.addAction(new NotificationCompat.Action(
                    android.R.drawable.ic_media_play, "播放",
                    MediaButtonReceiver.buildMediaButtonPendingIntent(
                            this, PlaybackStateCompat.ACTION_PLAY)));
        }

        return builder.build();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 处理媒体按钮事件，将意图转发给媒体会话进行处理
        MediaButtonReceiver.handleIntent(mediaSession, intent);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        mediaSession.release();
        stopForeground(true);
        super.onDestroy();
    }
    /**
     * 客户端首次连接时调用，返回 BrowserRoot 对象定义媒体内容根节点。
     */
    @Nullable
    @Override
    public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, @Nullable Bundle rootHints) {
        // 允许所有客户端连接
        return new BrowserRoot(MEDIA_ROOT_ID, null);
    }


    @Override
    public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) {
        // 返回空列表，因为我们不需要浏览媒体内容
        result.sendResult(new ArrayList<>());
    }

    @Override
    public android.os.IBinder onBind(Intent intent) {
        return super.onBind(intent); // 使用父类的 onBind
    }
}
